<?php
class ProjectAction extends Action
{
    function _initialize()
    {
        if(ACTION_NAME!="newPrj" && ACTION_NAME!="listPrj" && ACTION_NAME!="active" && Session::get("prj_path") == "")
        {
            $this->assign("jumpUrl",__URL__.C("PATH_DEPR")."listPrj");
            $this->error("请先选择项目");
        }
    }

	function newPrj()
	{
		if(!$this->isPost())
		{
			$root = rootpath();
			$this->assign("root",$root);
			$this->assign("pageFile","Project:new");
			$this->layout();
		}
		else
		{
			$project = rootpath().$_POST["prjname"];
			$subdir = isset($_POST["subdir"]);
			if($subdir)
			{
				$app_name = "App";
				$app_path = "./App";
			}
			else
			{
				$app_name = $_POST["prjname"];
				$app_path = "./";
			}
			
			if(!is_dir($project))
				mk_dir($project,0777); //新建项目目录
			//生成入口文件
			$content = '<?php
define(\'THINK_PATH\', \'../ThinkPHP\');  
define(\'APP_NAME\', \''.$app_name.'\'); 
define(\'APP_PATH\', \''.$app_path.'\'); 
require(THINK_PATH.\'/ThinkPHP.php\');  
$App = new App(); 
$App->run();
?>';
			file_put_contents($project."/index.php",$content);
			
			//如果要建子目录
			if($subdir){
				mk_dir($project."/App",0777);
				$project .= "/App";
			}
			mk_dirs(array(
				$project."/Lib",
				$project."/Conf",
				$project."/Common",
				$project."/Lang",
				$project."/Cache",
				$project."/Tpl",
				$project."/Tpl/default",
				$project."/Tpl/default/Public",
				$project."/Logs",
				$project."/Temp",
				$project."/Data",
				$project."/Lib/Model",
				$project."/Lib/Action"
            ));
			
			//把success.html copy到public目录下
			copy("success.html",$project."/Tpl/default/Public/success.html");

			//设置相关变量激活项目
			Session::set("project",rootpath().$_POST["prjname"]."/index.php");
            Session::set("prj_path",$project);
		
			$this->assign("jumpUrl",url("config"));
			$this->success("新建项目成功！");
		}
	}
    
	function listPrj()
	{
		$root = rootpath();

        $apps = array();
        if($handle = @opendir($root))
        {
            while(false !== ($dir = readdir($handle)))
            {
                if($dir != '.' && $dir != '..' && is_dir($root.$dir))
                {
                    if($fp = @opendir($root.$dir))
                    {
                        while(false !== ($file = readdir($fp)))
                        {
                            if($file != '.' && $file != '..' && is_file($root.$dir."/".$file) && strstr($file,".php"))
                            {
                                //这里会花点时间，没办法，得找出TP项目的入口文件，其他的文件全排除
                                $content = file_get_contents($root.$dir."/".$file);
                                if(strstr($content,"define('THINK_PATH") || strstr($content,"define(\"THINK_PATH"))
                                $apps[] = $root.$dir."/".$file;
                            }
                        }
                        closedir($fp);
                    }
                }
                else if($dir != '.' && $dir != '..' && is_file($root.$dir) && strstr($dir,".php"))
                {
                    //这里会花点时间，没办法，得找出TP项目的入口文件，其他的文件全排除
                    $content = file_get_contents($root.$dir);
                    if(strstr($content,"define('THINK_PATH") || strstr($content,"define(\"THINK_PATH"))
                    $apps[] = $root.$dir;
                }
            }
            closedir($handle);
        }

        $this->assign("apps",$apps);
        $this->assign("root",$root);
        $this->assign("pageFile","Project:list");
        $this->layout();
	}

	function active()
    {
        //把这个文件读出来，取出APP_PATH，与文件自己的path组装起来
        //结合TP的目录结构就可以操作任意目录了
        $content = file_get_contents($_GET["name"]);
		if(empty($content))
		{
			$this->error("无法读取入口文件内容！");
		}
        else if(preg_match('/[\'"]APP_PATH[\'"]\\s*?,\\s*?[\'"](.*?)[\'"]/', $content, $regs))
        {
            $path_parts = pathinfo($_GET["name"]);
            Session::set("project",$_GET["name"]);
            Session::set("prj_path",$path_parts["dirname"]."/".$regs[1]);
            Session::set("tables","");
            $history = S("history");
            if(!$history)
                $history = array();
            else if(count($history) >= 10)
                array_pop($history); //把最后一个pop出来
            array_unshift($history, $_GET["name"]);
            S("history",$history);

            $this->assign("jumpUrl",url("clearcache"));
            $this->success("激活".$_GET["name"]."项目成功");
        }
        else
        {
            $this->error("入口文件中无法找到APP_PATH的定义！");
        }
    }

    function config()
    {
        //index页面做配置信息的列表显示
        $tpConfigType = array(
"数据库设置"=>array('DB_TYPE'=>'数据库类型','DB_HOST'=>'服务器地址','DB_NAME'=>'数据库名','DB_USER'=>'用户名','DB_PWD'=>'密码','DB_PORT'=>'端口','DB_PREFIX'=>'数据库表前缀','DB_CHARSET'=>"数据库编码默认采用utf8",'DB_DEPLOY_TYPE'=>"数据库部署方式 0 集中式（单一服务器） 1 分布式（主从服务器）",'SQL_DEBUG_LOG'=>"Bool 是否记录SQL语句到日志文件",'DB_FIELDS_CACHE'=>"缓存数据表字段信息"),
"Dispatch设置"=>array('DISPATCH_ON'=>"Bool 是否启用Dispatcher",'DISPATCH_NAME'=>"默认的Dispatcher名称",'URL_MODEL'=>"URL模式:0 普通模式 1 PATHINFO 2 REWRITE 3 兼容PATHINFO",'PATH_MODEL'=>"PATHINFO模式 普通模式 1 智能模式 2",'PATH_DEPR'=>"PATHINFO参数之间分割号",'ROUTER_ON'=>"Bool 启用路由判断",'COMPONENT_DEPR'=>"组件模块和操作的URL分割符",'COMPONENT_TYPE'=>"组件目录结构 1 Lib\User\Action\ 2 Lib\Action\User\\"),
"日志设置"=>array('WEB_LOG_RECORD'=>"Bool 默认不记录日志",'LOG_FILE_SIZE'=>"日志文件大小限制"),
"插件设置"=>array('THINK_PLUGIN_ON'=>"Bool 是否启用插件机制"),
"防刷新设置"=>array('LIMIT_RESFLESH_ON'=>"Bool 是否启用防刷新机制",'LIMIT_REFLESH_TIMES'=>"页面防刷新时间 默认3秒"),
"错误设置"=>array('DEBUG_MODE'=>"Bool 调试模式 默认关闭",'ERROR_MESSAGE'=>"错误显示信息 非调试模式有效",'ERROR_PAGE'=>"错误定向页面"),
"系统变量设置"=>array(
'VAR_PATHINFO'=>"PATHINFO 兼容模式获取变量例如 ?s=/module/action/id/1 后面的参数取决于PATH_MODEL 和 PATH_DEPR",'VAR_MODULE'=>"默认模块获取变量",'VAR_ACTION'=>"默认操作获取变量",'VAR_ROUTER'=>"默认路由获取变量",'VAR_FILE'=>"默认文件变量",'VAR_PAGE'=>"默认分页跳转变量",'VAR_LANGUAGE'=>"默认语言切换变量",'VAR_TEMPLATE'=>"默认模板切换变量",'VAR_AJAX_SUBMIT'=>"默认的AJAX提交变量"),
"模块和操作设置"=>array('DEFAULT_MODULE'=>"默认模块名称",'DEFAULT_ACTION'=>"默认操作名称"),
"模板设置"=>array('TMPL_CACHE_ON'=>"Bool 是否开启模板编译缓存 false 的话每次都重新编译模板",'TMPL_CACHE_TIME'=>"模板缓存有效期 -1 永久 单位为秒",'TMPL_SWITCH_ON'=>"启用多模版支持",'DEFAULT_TEMPLATE'=>"默认模板名称",'TEMPLATE_SUFFIX'=>"默认模板文件后缀",'CACHFILE_SUFFIX'=>"默认模板缓存后缀",'TEMPLATE_CHARSET'=>"模板模板编码",'OUTPUT_CHARSET'=>"默认输出编码"),
"模型设置"=>array('CONTR_CLASS_PREFIX'=>'控制器前缀','CONTR_CLASS_SUFFIX'=>'控制器后缀','ACTION_PREFIX'=>'操作前缀','ACTION_SUFFIX'=>'操作后缀','MODEL_CLASS_PREFIX'=>'模型前缀','MODEL_CLASS_SUFFIX'=>'模型后缀'),
"静态缓存设置"=>array('HTML_FILE_SUFFIX'=>"默认静态文件后缀",'HTML_CACHE_ON'=>"Bool 是否关闭静态缓存",'HTML_CACHE_TIME'=>"静态缓存有效期",'HTML_READ_TYPE'=>"静态缓存读取方式 0 readfile 1 redirect",'HTML_URL_SUFFIX'=>"伪静态后缀设置"),
"语言时区设置"=>array('LANG_SWITCH_ON'=>"Bool 是否关闭多语言包功能",'DEFAULT_LANGUAGE'=>"默认语言",'TIME_ZONE'=>"默认时区"),
"用户认证设置"=>array('USER_AUTH_ON'=>"Bool 是否启用用户认证",'USER_AUTH_TYPE'=>"默认认证类型 1 登录认证 2 实时认证",'USER_AUTH_KEY'=>"用户认证SESSION标记",'ADMIN_AUTH_KEY'=>"管理员SESSION标记",'AUTH_PWD_ENCODER'=>"用户认证密码加密方式",'USER_AUTH_PROVIDER'=>"默认认证委托器",'USER_AUTH_GATEWAY'=>"默认认证网关",'NOT_AUTH_MODULE'=>"默认无需认证模块",'REQUIRE_AUTH_MODULE'=>"默认需要认证模块",'RBAC_ERROR_PAGE'=>"RBAC认证没有权限的错误页面"),
"SESSION设置"=>array('SESSION_NAME'=>"默认Session_name 如果需要不同项目共享SESSION 可以设置相同",'SESSION_PATH'=>"采用默认的Session save path",'SESSION_TYPE'=>"默认Session类型 支持 DB 和 File",'SESSION_EXPIRE'=>"默认Session有效期",'SESSION_TABLE'=>"数据库Session方式表名",'SESSION_CALLBACK'=>"反序列化对象的回调方法"),
"数据缓存设置"=>array('DATA_CACHE_TIME'=>"数据缓存有效期",'DATA_CACHE_COMPRESS'=>"Bool 数据缓存是否压缩缓存",'DATA_CACHE_CHECK'=>"Bool 数据缓存是否校验缓存",'DATA_CACHE_TYPE'=>"数据缓存类型 支持 File Db Apc Memcache Shmop Sqlite Xcache Apachenote Eaccelerator",'DATA_CACHE_SUBDIR'=>"Bool 是否使用子目录缓存 （自动根据缓存标识的哈希创建子目录）",'DATA_CACHE_TABLE'=>"数据缓存表 当使用数据库缓存方式时有效",'CACHE_SERIAL_HEADER'=>"文件缓存开始标记",'CACHE_SERIAL_FOOTER'=>"文件缓存结束标记",'SHARE_MEM_SIZE'=>"共享内存分配大小",'ACTION_CACHE_ON'=>"Bool 是否关闭Action 缓存"),
"运行时间设置"=>array('SHOW_RUN_TIME'=>"Bool 是否显示运行时间",'SHOW_ADV_TIME'=>"Bool 是否显示详细的运行时间",'SHOW_DB_TIMES'=>"Bool 是否显示数据库查询和写入次数",'SHOW_CACHE_TIMES'=>"Bool 是否显示缓存操作次数",'SHOW_USE_MEM'=>"Bool 是否显示内存开销",'SHOW_PAGE_TRACE'=>"Bool 是否显示页面Trace信息 由Trace文件定义和Action操作赋值"),
"模板引擎设置"=>array('TMPL_ENGINE_TYPE'=>"默认模板引擎 以下设置仅对使用Think模板引擎有效",'TMPL_DENY_FUNC_LIST'=>"模板引擎禁用函数",'TMPL_L_DELIM'=>"模板引擎普通标签开始标记",'TMPL_R_DELIM'=>"模板引擎普通标签结束标记",'TAGLIB_BEGIN'=>"标签库标签开始标记",'TAGLIB_END'=>"标签库标签结束标记",'TAG_NESTED_LEVEL'=>"标签库"),
"Cookie设置"=>array('COOKIE_EXPIRE'=>"Coodie有效期",'COOKIE_DOMAIN'=>"Cookie有效域名",'COOKIE_PATH'=>"Cookie路径",'COOKIE_PREFIX'=>"Cookie前缀 避免冲突"),
"分页设置"=>array('PAGE_NUMBERS'=>"分页显示页数",'LIST_NUMBERS'=>"分页每页显示记录数"),
"数据格式设置"=>array('AJAX_RETURN_TYPE'=>"AJAX 数据返回格式 JSON XML",'DATA_RESULT_TYPE'=>"默认数据返回格式 1 对象 0 数组"),
"其它设置"=>array('AUTO_LOAD_PATH'=>"__autoLoad 的路径设置 当前项目的Model和Action类会自动加载，无需设置 注意搜索顺序",'AUTO_LOAD_CLASS'=>"初始化需要导入的公共类 使用import的导入机制 例如 @.Action.CommonAction",'CALLBACK_LOAD_PATH'=>"反序列化对象时自动加载的路径设置",'UPLOAD_FILE_RULE'=>"文件上传命名规则 例如 time uniqid com_create_guid 等 支持自定义函数 仅适用于内置的UploadFile类",'LIKE_MATCH_FIELDS'=>"数据库查询的时候需要进行模糊匹配的字段",'ACTION_JUMP_TMPL'=>"默认跳转模板文件",'ACTION_404_TMPL'=>"显示404错误信息的文件")
        );
        $tpUserConfig = array();
        $tempConfig = include Session::get('prj_path').'/Conf/config.php';
        $tpUserConfig = array_merge($tpUserConfig,$tempConfig);

        foreach($tpUserConfig as $key=>$value)
        {
            if($value===true)
            $tpUserConfig[$key] = "true";
            if($value===false)
            $tpUserConfig[$key] = "false";
        }

        $this->assign("config",$tpConfigType);
        $this->assign("uc",$tpUserConfig);
        $this->assign("pageFile","Project:config");
        $this->layout();
    }

    function saveconfig()
    {
        $configfile = Session::get('prj_path').'/Conf/config.php';
        $content = "<?php\r\n//由ThinkPHP工具箱生成的配置文件\r\nif (!defined('THINK_PATH')) exit();\r\nreturn array(\r\n";
        foreach($_POST as $key=>$value)
        {
            if(($value=="" && ($key!="DB_PWD" && $key!="DB_PREFIX")) || substr($key,-5,5)=="_info")
            continue;//除了DB_PWD DB_PREFIX,其他空值都不写入配置文件
            if(strtolower($value)=="true" || strtolower($value)=="false" || is_numeric($value))
            $content .= "\t'$key'=>$value, //".$_POST[$key.'_info']."\r\n";
            else
            $content .= "\t'$key'=>'$value', //".$_POST[$key.'_info']."\r\n";
        }
        $content .= ");\r\n?>";
        file_put_contents($configfile,$content);

        $this->success('配置文件更新成功');
    }

    function clearcache()
    {
        if(isset($_POST["submit"]))
        {
            import("ORG.Io.Dir");
            if(strtolower($_POST["temp"]) == "on")
                Dir::del(Session::get('prj_path').'/Temp');
            if(strtolower($_POST["cache"]) == "on")
                Dir::del(Session::get('prj_path').'/Cache');
            if(strtolower($_POST["logs"]) == "on")
                Dir::del(Session::get('prj_path').'/Logs');
            if(strtolower($_POST["data"]) == "on")
                Dir::del(Session::get('prj_path').'/Data');
            $this->success("所有缓存均已清空");
        }
        else
        {
            $this->assign("pageFile","Project:clearcache");
            $this->layout();
        }
    }

    function coding(){
		//导入文件编码批量转换类
		import("ORG.Util.AppCodingSwitch");
        //因为检查和转换编码的结果直接在coding类中就输出了
        //得先自己接收起来才能在赋值到页面上显示
        ob_start();
		AppCodingSwitch::CodingSwitch(Session::get('prj_path'));
        $result = ob_get_clean();
        $this->assign("result",$result);
        $this->assign("pageFile","Project:coding");
        $this->layout();
	}
}
?>
